package cn.lg.soar.system.api.service;

import cn.lg.soar.system.api.model.*;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * @author luguoxiang
 * @date 2022/1/2
 * 开源项目：https://gitee.com/lgx1992/lg-soar 求star！请给我star！请帮我点个star！
 */
public interface IUserApi {

    /**
     * 根据id获取用户
     * @param userId
     * @return
     */
    UserQueryDTO getById(Long userId);

    /**
     * 根据id获取多个用户
     * @param ids
     * @return
     */
    List<UserQueryDTO> listByIds(Collection<Long> ids);

    /**
     * 根据用户名查询
     * @param username
     * @return
     */
    default UserQueryDTO getByUsername(String username) {
        return getByAccount(0, username);
    }

    /**
     * 创建用户
     * @param dto
     * @return
     */
    Long create(UserCreateDTO dto);

    /**
     * 修改用户
     * @param dto
     * @return
     */
    void update(UserUpdateDTO dto);

    /**
     * 获取用户当前所有角色
     * @param userId
     * @return
     */
    List<Long> getUserCurrentAllRoleIds(Long userId);

    /**
     * 判断某个用户是否是超级管理员
     * @param username
     * @return
     */
    boolean isSuperAdministrator(String username);

    boolean isSuperAdministrator(Long userId);

    default Map<Long, UserQueryDTO> mapByIds(Collection<Long> ids) {
        return listByIds(ids).stream().collect(Collectors.toMap(UserQueryDTO::getId, x -> x));
    }

    default Map<Long, String> nameMapper(Collection<Long> ids) {
        return listByIds(ids).stream().collect(Collectors.toMap(UserQueryDTO::getId, UserQueryDTO::getNickname));
    }

    /**
     * 根据角色 ID 获取用户 ID 列表
     */
    List<Long> idsByRoleId(Collection<Long> roleIds);

    /**
     * 根据单个角色 ID 获取用户 ID 列表
     */
    default List<Long> idsByRoleId(Long roleId) {
        return idsByRoleId(List.of(roleId));
    }


    /**
     * 根据组织机构 ID 集合获取用户 ID 列表
     */
    List<Long> idsByOrgId(Collection<Long> orgIds);

    /**
     * 根据单个组织机构 ID 获取用户 ID 列表
     */
    default List<Long> idsByOrgId(Long orgId) {
        return idsByOrgId(List.of(orgId));
    }


    /**
     * 根据岗位 ID 集合获取用户 ID 列表
     */
    List<Long> idsByPostId(Collection<Long> postIds);

    /**
     * 根据单个岗位 ID 获取用户 ID 列表
     */
    default List<Long> idsByPostId(Long postId) {
        return idsByPostId(List.of(postId));
    }

    /**
     * 获取用户id
     * @param orgId
     * @param roleId
     * @return
     */
    List<Long> idsByOrgAndRole(Long orgId, Long roleId);

    /**
     * 账号绑定（绑定手机号、绑定微信openid等）
     * @param dto
     */
    void binding(UserBindDTO dto);

    /**
     * 根据账号获取用户信息
     * @param accountType 账号类型
     * @param account 账号
     * @return
     */
    UserQueryDTO getByAccount(Integer accountType, String account);

    List<AuthAccountBind> userAccountList(Long userId);

}
